\documentclass{report}

\usepackage[portuguese]{babel}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{subfig}
\usepackage{float}
\usepackage{glossaries}
\usepackage{parskip}
\usepackage[top=3cm, bottom=2.5cm, left=3cm, right=3cm]{geometry}

\setcounter{tocdepth}{3}
\setcounter{secnumdepth}{3}

% Document's properties.
\newcommand{\DocTitle}{Pontos de benchmark do driver JDBC}
\newcommand{\DocAuthor}{Wilson Santos, 36228}
\newcommand{\DocSubject}{Dissertação de mestrado}
\newcommand{\DocKeywords}{JDBC, Native-protocol driver, Concurrency, SQL Server}

\hypersetup{
    bookmarks=true,         % show bookmarks bar?
    unicode=false,          % non-Latin characters in Acrobat’s bookmarks
    pdftoolbar=true,        % show Acrobat’s toolbar?
    pdfmenubar=true,        % show Acrobat’s menu?
    pdffitwindow=true,      % page fit to window when opened
    pdftitle={\DocTitle},       % title
    pdfauthor={\DocAuthor},     % author
    pdfsubject={\DocSubject},   % subject of the document
    pdfkeywords={\DocKeywords}, % list of keywords
    pdfnewwindow=true,          % links in new window
    colorlinks=true,        % false: boxed links; true: colored links
    linkcolor=red,          % color of internal links
    citecolor=green,        % color of links to bibliography
    filecolor=magenta,      % color of file links
    urlcolor=cyan           % color of external links
}


\begin{document}

\title{\DocTitle}
\author{Wilson Santos, 36228}
\maketitle

\section{Leitura de \emph{Tokens}}
Quando o SQL Server envia uma mensagem ao cliente, esta contém vários \emph{tokens}. Assim quando a mensagem chega ao cliente, cabe-lhe a responsabilidade de processar cada \emph{token} de modo a obter a informação que este transmite.

Uma vez que esta recepção dos \emph{tokens} é tão importante para a compreensão da mensagem do servidor, é também importante conhecer o impacto que a descodificação dos \emph{tokens} tem no desempenho do driver.

Uma vez que existe um \emph{token reader} especializado para cada \emph{token}, a avaliação do desempenho tanto pode ser realizada para um conjunto de \emph{tokens}, como para um \emph{token} específico.

\begin{table}[H]
  \caption{Ponto de \emph{benchmark} na leitura de \emph{tokens}}
  \label{tab:ben-readtokens}
  \centering
\begin{tabular}{*{2}{| l } |}
  \hline
  \textbf{Classe} & \emph{TokenReader} \\ \hline
  \textbf{Pacote} & \texttt{ws.jdbc.concurrent.driver.sqlserver.tds} \\ \hline
  \textbf{Método} & \texttt{readTokens} \\ \hline
\end{tabular}
\end{table}


\section{Navegação no \emph{Result Set}}
Uma vez que a acção de percorrer as diversas linhas do \emph{result set} será uma das principais operações a serem realizadas sobre este, é importante proceder à avaliação do desempenho do método utilizado para tal.

Num \emph{result set forward-only e read-only} são pedidas todas as linhas de uma só vez ao servidor SQL. Como este tipo de \emph{result set} apenas permite percorrer as linhas numa direcção e apenas uma de cada vez, a avaliação do desempenho é realizada no método \texttt{next()}.

Num \emph{result set scrollable} e num \emph{result set forward-only e updatable} são utilizados cursores do servidor SQL. É usada uma memória \emph{cache} para diminuir os pedidos ao servidor. O trabalho de verificar se a linha se encontra na \emph{cache} e fazer um novo pedido de linhas é realizado pelo método \emph{scroll}, por isso a avaliação de desempenho é realizada neste ponto.

\begin{table}[H]
  \caption{Ponto de \emph{benchmark} na navegação no \emph{result set forward-only e read-only}}
  \label{tab:ben-scroll-read}
  \centering
\begin{tabular}{*{2}{| l } |}
  \hline
  \textbf{Classe} & \emph{CResultSetForwardOnlyReadOnly} \\ \hline
  \textbf{Pacote} & \texttt{ws.jdbc.concurrent.driver.sqlserver} \\ \hline
  \textbf{Método} & \texttt{next} \\ \hline
\end{tabular}
\end{table}

\begin{table}[H]
  \caption{Ponto de \emph{benchmark} na navegação no \emph{result set scrollable}}
  \label{tab:ben-scroll}
  \centering
\begin{tabular}{*{2}{| l } |}
  \hline
  \textbf{Classe} & \emph{CResultSetScrollableReadOnly} \\ \hline
  \textbf{Pacote} & \texttt{ws.jdbc.concurrent.driver.sqlserver} \\ \hline
  \textbf{Método} & \texttt{scroll} \\ \hline
\end{tabular}
\end{table}

\section{Leitura dos valores das colunas}

Uma vez que cada valor lido tem de ser convertido do formato que o servidor utiliza para um dos tipos de dados de Java, é importante saber o impacto que esta operação tem no desempenho do driver.

\begin{table}[H]
  \caption{Ponto de \emph{benchmark} na leitura dos valores das colunas}
  \label{tab:ben-readvalue}
  \centering
\begin{tabular}{*{2}{| l } |}
  \hline
  \textbf{Classe} & \emph{CResultSetForwardOnlyReadOnly} \\ \hline
  \textbf{Pacote} & \texttt{ws.jdbc.concurrent.driver.sqlserver} \\ \hline
  \textbf{Método} & \texttt{getXXX} \\ \hline
\end{tabular}
\end{table}

\section{Actualização dos valores das colunas}

A actualização dos valores das colunas é realizada com o auxílio de uma classe, em que cada instância guarda um valor a ser actualizado. Por isso torna-se também importante de averiguar se o comportamento da classe implica perdas de desempenho ou não.

\begin{table}[H]
  \caption{Ponto de \emph{benchmark} na actualização dos valores das colunas}
  \label{tab:ben-updatevalue}
  \centering
\begin{tabular}{*{2}{| l } |}
  \hline
  \textbf{Classe} & \emph{UpdateValue} \\ \hline
  \textbf{Pacote} & \texttt{ws.jdbc.concurrent.driver.sqlserver.tds.rpc} \\ \hline
  \textbf{Método} & \texttt{construtor} \\ \hline
\end{tabular}
\end{table}

\end{document}
